import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import Mock from 'mockjs';
import { Todos } from './data/todoList';
import * as util from '../util/util';
export default {
    /**
     * mock bootstrap
     */
    start() {
        let mock = new MockAdapter(axios);

        // mock success request
        mock.onGet('/success').reply(200, {
            msg: 'success'
        });

        // mock error request
        mock.onGet('/error').reply(500, {
            msg: 'failure'
        });

        // get todo list
        mock.onGet('/todo/list').reply(config => {
            let mockTodo = Todos.map(tode => {
                return {
                    id: tode.id,
                    title: tode.title,
                    count: tode.record.filter((data) => {
                        if (data.checked === false) return true;
                        return false;
                    }).length,
                    locked: tode.locked,
                    isDelete: tode.isDelete
                };
            }).filter(tode => {
                if (tode.isDelete === true) return false;
                return true;
            });
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve([200, {
                        todos: mockTodo
                    }]);
                }, 200);
            });
        });

        // get one todo by id
        mock.onGet('/todo/listId').reply(config => {
            let {
                id
            } = config.params;
            let todo = Todos.filter(tode => {
                if (id && tode.id === id) return true;
                return false;
            })[0];
            todo.count = todo.record.filter((data) => {
                if (data.checked === false) return true;
                return false;
            }).length;
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve([200, {
                        tode: todo
                    }]);
                }, 200);
            });
        });

        // add a new todo
        mock.onPost('/todo/addTodo').reply(config => {
            var dateTitle = util.getTodayDate();
            Todos.push({
                id: Mock.Random.guid(),
                title: dateTitle,
                isDelete: false,
                locked: false,
                record: []
            });
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve([200]);
                }, 200);
            });
        });

        // add a new record, ready to do
        mock.onPost('/todo/addRecord').reply(config => {
            let {
                id,
                text
            } = JSON.parse(config.data);
            Todos.some((t, index) => {
                if (t.id === id) {
                    t.record.push({
                        text: text,
                        isDelete: false,
                        checked: false
                    });
                    return true;
                }
            });
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve([200]);
                }, 200);
            });
        });

        // change title
        mock.onPost('/todo/editTodo').reply(config => {
            let {
                todo
            } = JSON.parse(config.data);
            Todos.some((t, index) => {
                if (t.id === todo.id) {
                    t.title = todo.title;
                    t.locked = todo.locked;
                    t.isDelete = todo.isDelete;
                    return true;
                }
            });
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve([200]);
                }, 200);
            });
        });

        // change title
        mock.onPost('/todo/editRecord').reply(config => {
            let {
                id,
                record,
                index
            } = JSON.parse(config.data);
            Todos.some((t) => {
                if (t.id === id) {
                    t.record[index] = record;
                    return true;
                }
            });
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    resolve([200]);
                }, 200);
            });
        });
    }
};